using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    /// <summary>
    /// Klasa dla operacji bazodanowych specyficznych dla tabeli <code>variables</code>.
    /// </summary>
    public class VariableDAO : Abstracts.AbstractGenericDAO<Variable, System.Nullable<int>>,
        Interfaces.IVariableDAO
    {

        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "variable_id";
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie szablonu, nazwy typu i języka.
        /// </summary>
        /// <param name="templateId">szablon</param>
        /// <param name="variableTypeName">nazwa typu</param>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym szablonie, nazwie typu i języku</returns>
        public IQueryable<Variable> FindByTemplateAndTypeNameAndLanguage(int templateId, string variableTypeName, int languageId)
        {
            if (templateId.Equals(0) || languageId.Equals(0) || String.IsNullOrEmpty(variableTypeName))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Variable> variables = this._cmsEntitiesDataContext.Variables.Where(
                    vari => vari.template_id.Equals(templateId) && vari.language_id.Equals(languageId) &&
                        vari.variable_type_id.Equals(this._cmsEntitiesDataContext.VariableTypes.SingleOrDefault(
                        vaty => vaty.variable_type_name.Equals(variableTypeName)).variable_type_id)
                        );

                if (!(variables.Any()))
                {
                    return null;
                }   //if
                return variables;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym języku</returns>
        public IQueryable<Variable> FindByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Variable> variables = this._cmsEntitiesDataContext.Variables.Where(
                    vari => vari.language_id.Equals(languageId)
                        );

                if (!(variables.Any()))
                {
                    return null;
                }   //if
                return variables;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie szablonu i języka.
        /// </summary>
        /// <param name="templateId">szablon</param>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym szablonie i języku</returns>
        public IQueryable<Variable> FindByTemplateAndLanguage(int templateId, int languageId)
        {
            if ((templateId <= 0) || (languageId <= 0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Variable> variables = this._cmsEntitiesDataContext.Variables.Where(
                    vari => vari.template_id.Equals(templateId) && vari.language_id.Equals(languageId)
                );
                if (!(variables.Any()))
                {
                    return null;
                }   //if
                return variables;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie szablonu i języka.
        /// </summary>
        /// <param name="templateId">szablon</param>
        /// <param name="languageId">język</param>
        /// <param name="name">nazwa</param>
        /// <returns>Rekord o zadanym szablonie i języku</returns>
        public Variable FindByTemplateAndLanguageAndName(int templateId, int languageId, string name)
        {
            if ((templateId <= 0) || (languageId <= 0) || String.IsNullOrEmpty(name))
            {
                return null;
            }   //if
            try
            {
                Variable variable = this._cmsEntitiesDataContext.Variables.SingleOrDefault(
                    vari => vari.template_id.Equals(templateId) && vari.language_id.Equals(languageId) &&
                        vari.variable_name.Equals(name)
                );

                return variable;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        public bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId)
        {
            if (defaultLanguageId.Equals(0) || newLanguageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Variable> variables = this.FindByLanguage(defaultLanguageId);
                TemplateDAO _templateDAO = new TemplateDAO();
                if (variables == null)
                {
                    return true;
                }   //if
                if (!(variables.Any()))
                {
                    return true;
                }   //if
                foreach (Variable vari in variables)
                {
                    Template oldTemp = _templateDAO.FindByPK(vari.template_id);
                    if (oldTemp == null)
                    {
                        return false;
                    }
                    Template newTemp = _templateDAO.FindByLangAndName(newLanguageId, oldTemp.template_name);
                    if (newTemp == null)
                    {
                        return false;
                    }
                    Variable variableToInsert = new Variable();
                    variableToInsert.language_id = newLanguageId;
                    variableToInsert.variable_created = DateTime.Now;
                    variableToInsert.variable_created_by_id = vari.variable_created_by_id;
                    variableToInsert.variable_description = vari.variable_description;
                    variableToInsert.variable_editable = vari.variable_editable;
                    variableToInsert.variable_modified = DateTime.Now;
                    variableToInsert.variable_modified_by_id = vari.variable_modified_by_id;
                    variableToInsert.variable_name = vari.variable_name;
                    variableToInsert.variable_ordering = vari.variable_ordering;
                    variableToInsert.variable_published = vari.variable_published;
                    variableToInsert.variable_type_id = vari.variable_type_id;
                    variableToInsert.template_id = newTemp.template_id;
                    this.Add(variableToInsert);
                }

            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return true;
        }

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        public bool DeleteByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Variable> variables = this.FindByLanguage(languageId);
                if (variables == null)
                {
                    return true;
                }   //if
                if (!(variables.Any()))
                {
                    return true;
                }   //if
                foreach (Variable vari in variables)
                {
                    this._cmsEntitiesDataContext.Variables.DeleteOnSubmit(vari);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();

                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                return true;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }

    }
}
